package org.huangrui.spark.scala.core.rdd.instance

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Author hr
 * @Create 2024-10-16 8:45 
 */
object Spark02_RDD_Memory_Partition {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local").setAppName("spark")
    val sc = new SparkContext(conf)
    // TODO Kafka可以将数据进行切片（减小规模），也称之为分区，这个分区操作是底层完成的。
    //    Local 环境中，分区数量和环境核数相关，但是一般不推荐
    //    分区数量需要手动设定
    //       Spark在读取集合数据时，分区设定存在3种不同场合
    //         1.优先使用方法参数=>2
    //         2.使用配置参数：package$.default.parallelism=>4
    //         3.采用环境默认总核值
    val list: List[String] = List("zhangsan", "lisi", "wangwu")
    // TODO parallelize(并行)方法可以传递2个参数
    // 第一个参数表示对接的数据源集合
    // 第二个参数表示切片（分区）的数量 可以不需要指定
    //    spark会采用默认值进行分区(切片)
    //      numSlices=scheduler.conf.getInt("spark.default.parallelism",totalCores)
    //      从配置对象中获取配置参数: package.default.parallelisn(默认并行度)
    //      如果配置参数不存在，那么默认取值为 totalCores（当前环境总的虚拟核数）
    val rdd: RDD[String] = sc.parallelize(list, 3)
    // TODO 将数据模型分区后的数据保存到磁盘文件中
    // saveAsTextFile方法可以传递一个参数，表示输出的文件路径，路径可以为绝对路径，也可以相对路径
    // IDEA默认的相对路径以项目的根路径为准。
    rdd.saveAsTextFile("output")


    sc.stop()
  }
}
